package rpg.data
{

	public class SpriteStat extends GameData
	{
		/**
		 * 耐力 体质
		 */
		public var stamina : int;
		/**
		 * 智力 根骨
		 */
		public var intelligence : int;
		/**
		 *  力量
		 */
		public var strength : int;
		/**
		 * 敏捷  身法
		 */
		public var agility : int;


		public var maxHP : int;
		public var currHP : int;

		/**
		 *  每5秒恢复血量 ，不是百分比
		 */
		public var lifeRegenPer5Second : int;
		/**
		 * 每5秒恢复魔法值 ，不是百分比
		 */
		public var manaRegenPer5Second : int;

		/**
		 * 每格移动时间 ，比如50像素一个格子移动300MS
		 */
		public var stepTime : int;
		public var attackRange : int;
		public var attackDelay : int;
		public var physicalDamage : int;
		public var physicalDefence : int;

		public var magicDamage : int;
		public var magicDefence : int;

		/**
		 * 命中率
		 */
		public var hitRate : int;
		/**
		 * 闪避庇
		 */
		public var dodgeRate : int;
		/**
		 *  暴击率
		 */
		public var criticalRate : int;

		/**
		 * 物理暴击倍率 ，增加的物理暴击倍率，即玩家物理伤害造成暴击之后所造成的普通攻击的倍率
		 */
		public var physicalCriticalMultiple : int;
		/**
		 *  魔法暴击倍率 ，增加的魔法暴击倍率，即玩家魔法伤害造成暴击之后所造成的普通攻击
		 */
		public var magicalCriticalMultiple : int;

		/**
		 * 物理伤害系数：攻击方使用物理伤害的加成系数，百分比
		 */
		public var physicalDamageCoefficient : int;
		/**
		 * 魔法伤害系数：攻击方使用魔法伤害的加成系数，百分比
		 */
		public var magicDamageCoefficient : int;
		/**
		 * 物理受伤系数：防守方被物理伤害时的加成系数，百分比
		 */
		public var physicalHurtCoefficient : int;
		/**
		 * 魔法受伤系数：防守方被魔法伤害时的加成系数，百分比
		 */
		public var magicHurtCoefficient : int;

		/**
		 * 经验倍率
		 */
		public var expRate : int;

		//在初始化时反射自己
		private static var propertyXml : XML;

		public function SpriteStat()
		{
		}

		/**
		 * 基础属性转化率
		 */
		public function init() : void
		{
			//physicalDamage += (strength + agility + intelligence) * 2;
		}

		/**
		 * 将两个SpriteStat相加得出新的SpriteStat
		 * @param value1
		 * @param value2
		 * @return  相加后的SpriteStat
		 */
		public static function addition(value1 : SpriteStat , value2 : SpriteStat) : SpriteStat
		{
			var temp : SpriteStat = new SpriteStat();

			for each(var variable : * in propertyXml.variable)
			{
				var key : String = String(variable.@name);
				temp[key] = value1[key] + value2[key];
			}
			return temp;
		}

		/**
		 * 将两个SpriteStat相减得出新的SpriteStat
		 * @param value1
		 * @param value2
		 * @return  相减后的SpriteStat
		 */
		public static function subduction(value1 : SpriteStat , value2 : SpriteStat) : SpriteStat
		{
			var temp : SpriteStat = new SpriteStat();

			for each(var variable : * in propertyXml.variable)
			{
				var key : String = String(variable.@name);
				temp[key] = value1[key] - value2[key];
			}
			return temp;
		}


		/**
		 * 将自己与另一个SpriteStat相加
		 * @param toAdd
		 * @return 相加后的对象
		 */
		public function addStat(toAdd : SpriteStat) : SpriteStat
		{
			if(toAdd == null)
			{
				return this;
			}
			for each(var variable : * in propertyXml.variable)
			{
				var key : String = String(variable.@name);
				this[key] = this[key] + toAdd[key];
			}

			return this;
		}

		public function removeStat(toDesc : SpriteStat) : SpriteStat
		{
			if(toDesc == null)
			{
				return this;
			}
			for each(var variable : * in propertyXml.variable)
			{
				var key : String = String(variable.@name);
				this[key] = this[key] - toDesc[key];
			}

			return this;
		}

		/**
		 * 获取非空属性的数目
		 * @return
		 */
		public function getNoneEmeptyCount() : int
		{
			var count : int;
			var xml : XML = propertyXml;
			for each(var variable : * in propertyXml.variable)
			{
				var key : String = String(variable.@name);
				if(key != 'id' && this[key] && this[key] is int)
				{
					count++;
				}
			}
			return count;
		}


		/**
		 * 表内原始的数值
		 */
		public function get basePhysicalDamage() : int
		{
			return physicalDamage; //- (strength + agility + intelligence) * 2;
		}

		public function getPhysicalDamage() : int
		{
			return physicalDamage + (strength + agility + intelligence) * 2;
		}
	}
}